home *** CD-ROM | disk | FTP | other *** search
- void
- do_join(TARG,arglast)
- register STR *TARG;
- int *arglast;
- {
- register STR **st = stack->ary_array;
- int sp = arglast[1];
- register int items = arglast[2] - sp;
- register char *delim = str_get(st[sp]);
- register STRLEN len;
- int delimlen = st[sp]->str_cur;
-
- st += sp + 1;
-
- len = (items > 0 ? (delimlen * (items - 1) ) : 0);
- if (TARG->str_len < len + items) { /* current length is way too short */
- while (items-- > 0) {
- if (*st)
- len += (*st)->str_cur;
- st++;
- }
- STR_GROW(TARG, len + 1); /* so try to pre-extend */
-
- items = arglast[2] - sp;
- st -= items;
- }
-
- if (items-- > 0)
- str_sset(TARG, *st++);
- else
- str_set(TARG,"");
- len = delimlen;
- if (len) {
- for (; items > 0; items--,st++) {
- str_ncat(TARG,delim,len);
- str_scat(TARG,*st);
- }
- }
- else {
- for (; items > 0; items--,st++)
- str_scat(TARG,*st);
- }
- STABSET(TARG);
- }
-
-